home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD32 Gamer 22 / CD32 Gamer - 1996 - Issue 22.iso / fli / src / decode.s < prev    next >
Text File  |  1994-11-06  |  4KB  |  190 lines

  1. ; void __asm decode_lc (register __a0 UBYTE *chunkbuf,
  2. ;                       register __a1 UBYTE *chunky,
  3. ;                       register __a3 UBYTE *dirty_list);
  4.  
  5. ; void __asm decode_lc_xlate (register __a0 UBYTE *chunkbuf,
  6. ;                             register __a1 UBYTE *chunky,
  7. ;                             register __a2 UBYTE *xlate,
  8. ;                             register __a3 UBYTE *dirty_list);
  9.  
  10.         xdef    _decode_lc
  11.         xdef    _decode_lc_xlate
  12.  
  13.         xref    _screen_width
  14.         xref    _screen_width32
  15.  
  16. TRUE        equ    1
  17.  
  18. ;  UBYTE a5 *chunky2;
  19. ;  UWORD d3 lines, d4 packets, d6 start;
  20. ;  UBYTE d5 bsize
  21. ;  d2 = TRUE
  22. ;  2nd low byte of d0 is always 0
  23.  
  24. _decode_lc:    movem.l    d2-d6/a2-a3/a5-a6,-(sp)
  25.  
  26.         moveq    #TRUE,d2    ; d2 = TRUE
  27.         moveq    #0,d0
  28.  
  29.         moveq    #0,d6        ; start = *chunkbuf++;
  30.         move.b    (a0)+,d6
  31.  
  32.         move.b    (a0)+,d1    ; start |= (*chunkbuf++ << 8);
  33.         lsl.w    #8,d1
  34.         or.w    d1,d6
  35.  
  36.         move.w    (_screen_width),d1
  37.         mulu    d6,d1        ; chunky = &chunky[start * screen_width];
  38.         adda.l    d1,a1
  39.  
  40.         lsr.l    #5,d1        ; dirty_list = &dirty_list[start * screen_width32];
  41.         adda.l    d1,a3
  42.  
  43.         moveq    #0,d3        ; lines = *chunkbuf++;
  44.         move.b    (a0)+,d3
  45.  
  46.         move.b    (a0)+,d1    ; lines |= (*chunkbuf++ << 8);
  47.         lsl.w    #8,d1
  48.         or.w    d1,d3
  49.  
  50.         bra.b    end_loop1    ; for ( ; lines > 0; lines--) {
  51.  
  52. loop1:        movea.l    a1,a5        ; chunky2 = chunky;
  53.  
  54.         moveq    #0,d4        ; for (packets = *chunkbuf++; packets > 0; packets--) {
  55.         move.b    (a0)+,d4
  56.         bra.b    end_loop2
  57.  
  58. loop2:        move.b    (a0)+,d0    ; chunky2 += *chunkbuf++;
  59.         adda.w    d0,a5
  60.  
  61.         move.l    a5,d6        ; start = (chunky2 - chunky) >> 5;
  62.         sub.l    a1,d6
  63.         lsr.l    #5,d6
  64.  
  65.         move.b    (a0)+,d5    ; bsize = *chunkbuf++;
  66.  
  67.         bpl.b    1$        ; if (bsize > 127) {
  68.  
  69.         move.b    (a0)+,d0    ; memset (chunky2, *chunkbuf++, 256-bsize);
  70. 2$:        move.b    d0,(a5)+
  71.         addq.b    #1,d5
  72.         bne.b    2$
  73.  
  74.         bra.b    4$        ; } else {
  75.  
  76. 1$:        move.b    (a0)+,(a5)+    ; memcpy (chunky2, chunkbuf, bsize);
  77.         subq.b    #1,d5        ; chunkbuf += bsize;
  78.         bne.b    1$
  79.  
  80. 4$:        move.l    a5,d1        ; memset (&dirty_list[start], TRUE,
  81.         subq.l    #1,d1        ;   ((chunky2-1-chunky) >> 5)-start+1);
  82.         sub.l    a1,d1
  83.         lsr.l    #5,d1
  84.         sub.w    d6,d1
  85.         addq.w    #1,d1
  86.         lea    (a3,d6.w),a6
  87. 12$:        move.b    d2,(a6)+
  88.         subq.w    #1,d1
  89.         bne.b    12$
  90.  
  91. end_loop2:    dbra    d4,loop2
  92.  
  93.         adda.w    (_screen_width),a1    ; chunky += screen_width;
  94.         adda.w    (_screen_width32),a3    ; dirty_list += screen_width32;
  95.  
  96. end_loop1:    dbra    d3,loop1
  97.  
  98.         movem.l    (sp)+,d2-d6/a2-a3/a5-a6
  99.         rts
  100.  
  101.  
  102. ;------------------------------------------------------------------------
  103.  
  104. ;  UBYTE a5 *chunky2;
  105. ;  UWORD d3 lines, d4 packets, d6 start;
  106. ;  UBYTE d5 bsize
  107. ;  d2 = TRUE
  108. ;  2nd low byte of d0 is always 0
  109.  
  110. _decode_lc_xlate: movem.l    d2-d6/a2-a3/a5-a6,-(sp)
  111.  
  112.         moveq    #TRUE,d2
  113.         moveq    #0,d0
  114.  
  115.         moveq    #0,d6        ; start = *chunkbuf++;
  116.         move.b    (a0)+,d6
  117.  
  118.         move.b    (a0)+,d1    ; start |= (*chunkbuf++ << 8);
  119.         lsl.w    #8,d1
  120.         or.w    d1,d6
  121.  
  122.         move.w    (_screen_width),d1
  123.         mulu    d6,d1        ; chunky = &chunky[start * screen_width];
  124.         adda.l    d1,a1
  125.  
  126.         lsr.l    #5,d1        ; dirty_list = &dirty_list[start * screen_width32];
  127.         adda.l    d1,a3
  128.  
  129.         moveq    #0,d3        ; lines = *chunkbuf++;
  130.         move.b    (a0)+,d3
  131.  
  132.         move.b    (a0)+,d1    ; lines |= (*chunkbuf++ << 8);
  133.         lsl.w    #8,d1
  134.         or.w    d1,d3
  135.  
  136.         bra.b    end_loopx1    ; for ( ; lines > 0; lines--) {
  137.  
  138. loopx1:        movea.l    a1,a5        ; chunky2 = chunky;
  139.  
  140.         moveq    #0,d4        ; for (packets = *chunkbuf++; packets > 0; packets--) {
  141.         move.b    (a0)+,d4
  142.         bra.b    end_loopx2
  143.  
  144. loopx2:        move.b    (a0)+,d0    ; chunky2 += *chunkbuf++;
  145.         adda.w    d0,a5
  146.  
  147.         move.l    a5,d6        ; start = (chunky2 - chunky) >> 5;
  148.         sub.l    a1,d6
  149.         lsr.l    #5,d6
  150.  
  151.         move.b    (a0)+,d5    ; bsize = *chunkbuf++;
  152.  
  153.         bpl.b    1$        ; if (bsize > 127) {
  154.  
  155.         move.b    (a0)+,d0    ; memset (chunky2, xlate[*chunkbuf++], 256-bsize);
  156.         move.b    (a2,d0.w),d0    ; chunky2 += bsize;
  157. 2$:        move.b    d0,(a5)+
  158.         addq.b    #1,d5
  159.         bne.b    2$
  160.  
  161.         bra.b    4$        ; } else {
  162.  
  163. 1$:        move.b    (a0)+,d0    ; for ( ; bsize > 0; bsize--)
  164.         move.b    (a2,d0.w),(a5)+    ; *chunky2++ = xlate[*chunkbuf++];
  165.         subq.b    #1,d5
  166.         bne.b    1$
  167.  
  168. 4$:        move.l    a5,d1        ; memset (&dirty_list[start], TRUE,
  169.         subq.l    #1,d1        ;   ((chunky2-1-chunky) >> 5)-start+1);
  170.         sub.l    a1,d1
  171.         lsr.l    #5,d1
  172.         sub.w    d6,d1
  173.         addq.w    #1,d1
  174.         lea    (a3,d6.w),a6
  175. 12$:        move.b    d2,(a6)+
  176.         subq.w    #1,d1
  177.         bne.b    12$
  178.  
  179. end_loopx2:    dbra    d4,loopx2
  180.  
  181.         adda.w    (_screen_width),a1    ; chunky += screen_width;
  182.         adda.w    (_screen_width32),a3    ; dirty_list += screen_width32;
  183.  
  184. end_loopx1:    dbra    d3,loopx1
  185.  
  186.         movem.l    (sp)+,d2-d6/a2-a3/a5-a6
  187.         rts
  188.  
  189.         end
  190.